#include <stdio.h>
#include <math.h>

/*
 * 方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。
 *
 * 概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。
 *
 * 统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。
 * 不存在负数。
 *
 * 实际问题中，研究方差即偏离程度有着重要意义。
 *
 * 方差在任何情况下都是正数，协方差值可正可负。
 *
 * 协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。
 * 而方差是协方差的一种特殊情况，即当两个变量是相同的情况。
 * 
 * 协方差表示的是两个变量的总体的误差，这与只表示一个变量误差的方差不同。
 * 如果两个变量的变化趋势一致，也就是说如果其中一个大于自身的期望值，
 * 另外一个也大于自身的期望值，那么两个变量之间的协方差就是正值。
 * 如果两个变量的变化趋势相反，即其中一个大于自身的期望值，
 * 另外一个却小于自身的期望值，那么两个变量之间的协方差就是负值。
 */

/**
 * variance - find variance.
 * @sample  : All samples
 * @sam_len : samples length 
 */
float variance(int sample[], int sam_len)
{
	float all_sample_average = 0;
	float all_sample_sum = 0;
	int i = 0;

	for (i = 0; i < sam_len; i++) {
		all_sample_sum += sample[i];
	}

	all_sample_average = (float)(all_sample_sum / sam_len);		/* Average of all samples */

	all_sample_sum = 0;
	for (i = 0; i < sam_len; i++) {
		all_sample_sum += pow(sample[i] - all_sample_average, 2);
	}

	return all_sample_sum / sam_len;
}

int main()
{
	int var[5] = {1, 2, 3, 4, 5};

	printf("%lf\n", pow(2.0, 2));					/* 4.000000 */
	printf("variance = %f\n", variance(var, 5));	/* 2.000000 */

	return 0;
}
